home *** CD-ROM | disk | FTP | other *** search
- /* define.c -- explicitly define a named symbol. */
-
- /* This file is part of DLD, a dynamic link/unlink editor for C.
-
- Copyright (C) 1990 by W. Wilson Ho.
-
- The author can be reached electronically by how@cs.ucdavis.edu or
- through physical mail at:
-
- W. Wilson Ho
- Division of Computer Science
- University of California at Davis
- Davis, CA 95616
- */
-
- /* This program is free software; you can redistribute it and/or modify it
- under the terms of the GNU General Public License as published by the
- Free Software Foundation; either version 1, or (at your option) any
- later version. */
-
- #include "defs.h"
-
- /*
- * explicitly define the value for symbol NAME.
- *
- * SIZE is the number of bytes required.
- */
- dld_define_sym (name, size)
- char *name;
- unsigned int size;
- {
- register char *p = 0;
- struct nlist dummy_nlist; /* simulate a nlist entry so that
- _dld_entery_global_ref can be used. */
- register int old_undefined_sym_count;
-
- if (name == 0 || size == 0)
- return 0;
-
- if (setjmp (_dld_env)) {
- if (p) free (p);
- return dld_errno;
- }
-
- if (_dld_dummy_entry == 0)
- _dld_create_dummy_entry ();
-
- bzero (&dummy_nlist, sizeof (struct nlist));
-
- p = (char *) _dld_malloc (strlen(name) +2);
- *p = '_';
- strcpy (p+1, name);
-
- dummy_nlist.n_un.n_name = p;
- dummy_nlist.n_type = N_UNDF | N_EXT;
- dummy_nlist.n_value = size;
-
- old_undefined_sym_count = dld_undefined_sym_count;
- _dld_enter_global_ref (_dld_dummy_entry, &dummy_nlist, p);
-
- free (p);
-
- if (old_undefined_sym_count != dld_undefined_sym_count) {
- _dld_patch_all_files (_dld_latest_entry);
- _dld_exec_flags_valid = 0;
- }
-
- return 0;
- } /* dld_define_sym */
-